package com.dhj.task;

import com.dhj.pojo.Item;
import com.dhj.service.ItemService;
import com.dhj.utils.HttpUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * @author DaHuaJia
 * @Description ItemTask 类
 * @Date 2021-11-20 14:03:20
 */
@Component
public class ItemTask {

    @Autowired
    private HttpUtils httpUtils;

    @Autowired
    private ItemService itemService;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 定时器任务间隔时间，100秒
    @Scheduled(fixedDelay = 100*1000)
    public void itemTask() throws Exception{
        // 声明需要解析的初始地址
        String url = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&suggest=1.his.0.0&wq=%E6%89%8B%E6%9C%BA&pvid=fe3cc7985e654fc9a56ba7444121e4ce&s=56&click=0&page=";

        // 按照页面对手机搜索结果进行遍历解析
        for(int i=1; i<10; i+=2){
            String html = httpUtils.doGetHtml(url + i);
            // 解析页面，获取商品数据并存储
            analysisHtml(html);
        }

        System.out.println("========== 定时任务结束 ==========");
    }

    /**
     * 解析页面，获取商品数据并存储
     */
    private void analysisHtml(String html) throws Exception {
        // 解析html获取Document
        Document doc = Jsoup.parse(html);
        // 获取spu列表
        Elements spuElements = doc.select("div#J_goodsList > ul > li");
        // 遍历
        for (Element spuEle : spuElements){

            // 获取spu
            String spu = spuEle.attr("data-spu");
            // 获取sku列表
            Elements skuElements = spuEle.select("li.ps-item");
            for(Element skuEle : skuElements){
                // 获取sku
                String sku = skuEle.select("[data-sku]").attr("data-sku");

                // 查询商品是否存在
                Item item = new Item();
                item.setSku(sku == "" ? 0 : Long.parseLong(sku));

                List<Item> list = itemService.queryItemByItem(item);
                if(list.size() > 0){
                    // 如果该商品已经存在，这不做处理
                    continue;
                }

                item.setSpu(spu == "" ? 0 : Long.parseLong(spu));
                // 设置商品详情url
                item.setUrl("https://item.jd.com/"+sku+".html");

                // 设置图片
                String picUrl = "https:" + skuEle.select("img[data-sku]").first().attr("data-lazy-img");
                picUrl = picUrl.replace("/n9/", "/n1/");
                String picName = httpUtils.doGetImages(picUrl);
                item.setPic(picName);

                // 设置商品价格
                double price = 0.0;
                String priceJson = httpUtils.doGetHtml("https://p.3.cn/prices/mgets?skuIds=J_"+sku);
                if(StringUtils.isNotBlank(priceJson)){
                    price = MAPPER.readTree(priceJson).get(0).get("p").asDouble();
                }
                item.setPrice(price);

                // 获取商品标题
                String itemInfo = httpUtils.doGetHtml(item.getUrl());
                String title = "";
                if(StringUtils.isNotBlank(itemInfo)){
                    title = Jsoup.parse(itemInfo).select("div.sku-name").first().text();
                }
                item.setTitle(title);

                item.setCreated(new Date());
                item.setUpdated(new Date());

                itemService.saveItem(item);
            }

        }

    }

}

